--@module deviceConfig
require "tool"

module(..., package.seeall)
local filePath = "/deviceConf.cnf" --保存的文件系统路径

--@class MQTTCLASS
--@field username string mqtt-username
--@field password string mqtt-password
--@field clientid string mqtt-clientid
--@field hasinit boolean 是否已经通过苍穹初始化

--@class DeviceConfigClass
--@field mqtt MQTTCLASS mqtt配置


--@type DeviceConfigClass
local defconfig = {}
-- 初始化配置表
function initDevConfig()
    defconfig = {
        mqtt = {
            hasinit = false, -- 是否已经通过苍穹初始化
            username="",
            password="",
            clientid=""
        }
    }
end

--@type DeviceConfigClass
local data = {}

local function init()
    initDevConfig()
    if io.exists(filePath) then
        local dat, res, err = json.decode(io.readFile(filePath))
        if res then
            log.info("ConfigClass", "refresh success" .. filePath)
            -- 避免版本升级过程中添加了字段没作用
            data = tool.confTableMerge(dat, defconfig, nil)
        else
            data = tool.deepCopy(defconfig)
            log.error("ConfigClass", "has not file" .. filePath .. ",err=" .. err)
        end
    else
        data = tool.deepCopy(defconfig)
    end
    defconfig = {}

    collectgarbage("collect")
end
--开机时先从文件系统读取
init()

-- 为了避免保存时改变data的指针导致其他任务获取不到，调用后需重启才会生效
local function saveNew(newdata)
    --tool.print_dump(self.data)
    local jsondata = json.encode(newdata)
    --log.info("testJson.encode",jsondata)
    io.writeFile(filePath, jsondata)
    jsondata = nil
    collectgarbage("collect")
end
-- 将data保存到文件系统中
function save()
    saveNew(data)
end
-- 将文件系统中的数据清除
function delete()
    if io.exists(filePath) then
        local res = os.remove(filePath)
        if res then
            log.info("deviceConf", "delete success file" .. filePath)
        else
            og.error("deviceConf", "delete fail file" .. filePath)
        end
    end
end

-- 将当前数据以json的方式打印出来
function logjson()
    log.info("deviceConf", "logjson==" .. json.encode(data))
end

--@return DeviceConfigClass
function getData()
    return data
end

function setData(dat)
    data = dat
end

-- ===================================方法调用=====================================
function setMqttInfo(clientid,username,password)
    -- 已经设置了
    if data.mqtt.clientid ~= clientid or data.mqtt.username ~= username
            or data.mqtt.password ~= password then
        -- 设置为新增并且重启
        data.mqtt.hasinit = true
        data.mqtt.clientid = clientid
        data.mqtt.username = username
        data.mqtt.password = password
        save()
        sys.timerStart(function()
            sys.restart("mqtt info change")
        end, 2000)
    end

end
